package TreeSet集合;

// 目标: 掌握TreeSet集合的使用

import HashSet集合的基层原理.Student;

import javax.swing.*;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class main {
    public static void main(String[] args) {
        // 特点: 不重复, 无索引, 可排序(默认升序排序, 按照元素的大小, 有小到大排序)
        // 底层是基于红黑树实现的排序
        Set<Integer> set1 = new TreeSet<>();
        set1.add(6);
        set1.add(5);
        set1.add(5);
        set1.add(7);
        set1.add(3);
        System.out.println(set1);
        // 想具体原理要看视频,在se进阶集合中

        // 注意:
        // 对于数据类型: Integer, Double, 默认按照数值本身大小进行升序排序
        // 对于字符串类型; 默认按照首字符的编号升序排序
        // 对于自定义类型如Student对象, TreeSet默认是无法直接排序的

//        Set<Student> students = new TreeSet<>();
//        students.add(new Student("蜘蛛精",23,169.7));
//        students.add(new Student("紫霞",22,169.8));
//        students.add(new Student("至尊宝",26,165.5));
//        students.add(new Student("牛魔王",22,183.5));
//        System.out.println(students);
        // 自定一排序规则
        // TreeSet集合储存自定义类型对象时, 必须指定排序顺序, 支持如下两种方式来指定比较规则
        // 1. 方式一: 让自定义的类(如学生类) 实现Comparable接口, 重写里面的compareTo方法来指定比较规则
        // 2. 方式二: 通过调用TreeSet集合有参数构造器, 可以设置Comparator对象(比较器对象, 用于指定比较规则).
        // public TreeSet(Comparator<? super E> comparator)

        // 方法一之前写过,就不写了,忘了翻前面

        // 方法二:
        Set<Student> students = new TreeSet<>((o1, o2) -> Double.compare(o1.getAge() , o2.getAge()));// 匿名内部类的Lambda表达式写法
        // 如果比年龄的话, 牛魔王的数据就没了
        students.add(new Student("蜘蛛精",23,169.7));
        students.add(new Student("紫霞",22,169.8));
        students.add(new Student("至尊宝",26,165.5));
        students.add(new Student("牛魔王",22,183.5));
        System.out.println(students);
    }
}
